<?php

/*
 * 日志操作类(单例模式)
 * 1.获得要保存日志的路径。
 * 2.判断路径是否存在,不存在则创建,存在则新建一个system.log的日志文件.
 * 3.当文件超过2M的大小,则随机重命名一个文件--以日期时间做文件名的.log文件,然后在新建一个
 *   system.log文件存储当前日志.
 */
class Logclass extends Filecontrol
{
    static private $ins=NULL;
    private $log_path='';   //日志文件存放路径
    private $logname='system.log'; //日志文件名字
    private $fhand=NULL;  //文件句柄
    private $log_size=1048576; //日志文件大小超过这个数，将自动保存的日期文件夹下
    private $full_log_path='';  //完整日志文件路径
    private function __construct() {
        global $_G;
        $this->log_path=  empty($_G['log']['log_path'])?ROOT."data/systemlog/":$_G['log']['log_path'];
      
           if($this->mkdirs($this->log_path)) //文件创建成功！
           {
            // var_dump($this->log_path);
           //  var_dump(is_dir($this->log_path));
             //  echo 'success';
           }
           else  //文件夹创建失败
           {
             //   echo 'fail';
           }
           $this->full_log_path=$this->log_path.$this->logname;
           if(!file_exists($this->full_log_path))
           {
             touch($this->full_log_path);
           }
           $this->log_size=$_G['log']['log_size']*1024*1024;
         // $this->fhand=fopen($this->log_path.$this->logname, 'a+b');
        
    }
   

    //获得类的实例化
    static public function getInstance()
    {
        if(!(self::$ins instanceof self))
        {
            self::$ins=new self();
        }
        return self::$ins;
    }
    /*
     * 移动日志文件到以日期命名的文件夹中，当日志文件超过10MB时候。
     */
    private function _move_log_file()
    {
      
      $fsize= filesize($this->full_log_path);
     // echo $renamepath;
      if($fsize>$this->log_size)
      {
        $renamepath= $this->log_path.date("Y-m-d")."/";
        $this->mkdirs($renamepath);
        $rename= date("Y-m-d_H-i-s").".txt";
        if(rename($this->full_log_path,  $renamepath.$rename))
        {
          //移动成功
          Debugshow::show("Logclass.php文件里：移动".$this->full_log_path."文件到".$renamepath.$rename."成功！");
        }
        else
        {
           //移动失败
           Debugshow::show("Logclass.php文件里：移动".$this->full_log_path."文件到".$renamepath.$rename."失败！");
        }
       }
    }
    /*
     * 写日日志,参数$str要写入的字符串
     */
    public function write($str,$type='none')
    {
       //fclose($this->fhand);
       
      $this->_move_log_file();
      $count=0;
      $this->fhand=fopen($this->full_log_path, 'ab');
      if($type=='none'){
      $count=fwrite($this->fhand, $str);
      }elseif($type=='line'){
      $count=fwrite($this->fhand, $str."----[".date('Y-m-d h:i:s')."]\r\n");
      }else{
       Debugshow::show(__FILE__.':write函数$type类型未知！');
      }
      fclose($this->fhand);
      return $count;
    }
    /*
     * 写入一行内容
     */
    public function writeline($str)
    {
      $this->write($str,'line');
    }
    /*
     *读取日志，返回读取内容 
     */
    public function read()
    {
       $this->fhand=fopen($this->full_log_path, 'rb');
       $contents = '';
        while (!feof($this->fhand)) {
          $contents .= fread($this->fhand, 8192);
        }
        fclose($this->fhand);
        return $contents;
    }
    /*
     * 读取指定行的内容
     */
    public function readline($line=0)
    {
      $this->fhand=fopen($this->full_log_path, 'rb');
      $line_index=0;
      $content='';
      while(!feof($this->fhand))
      {
        $content=  fgets($this->fhand);
      //  Debugshow::show($line_index);
        $line_index++;
        if($line_index>$line)
        {
          break;
        }
      }
      if(!$content)
      {
        Debugshow::show(__FILE__.':readline方法执行失败！没那么多行');
      }
      fclose($this->fhand);
      return $content;
    }

    //关闭文件资源
    public function __destruct() {
    
    }
}
?>
